//package com.rongmei.jdsync.utils;
//
//import com.rongmei.jdsync.annotation.ExcelColumn;
//import com.rongmei.jdsync.entity.GoodsDetail;
//import com.rongmei.jdsync.entity.SkuData;
//import com.rongmei.jdsync.entity.vo.RmGoodsMainVO;
//import com.rongmei.jdsync.entity.vo.RmGoodsSpecVO;
//import org.apache.poi.ss.usermodel.*;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.lang.reflect.Field;
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.Comparator;
//import java.util.List;
//
//public class ExcelExportUtil {
//
//    /**
//     * 将商品详情列表导出为Excel文件的字节数组
//     *
//     * @param goodsDetails 商品详情列表，包含要导出的商品数据
//     * @return Excel文件的字节数组
//     * @throws IOException 如果IO操作失败
//     */
//    public static byte[] exportGoodsToExcel(List<GoodsDetail> goodsDetails) throws IOException {
//        try (Workbook workbook = new XSSFWorkbook()) {
//            // 创建主信息工作表
//            Sheet mainSheet = workbook.createSheet("商品主体信息");
//            createSheetHeader(mainSheet, RmGoodsMainVO.class);
//
//            // 创建规格信息工作表
//            Sheet specSheet = workbook.createSheet("规格及规格值");
//            createSheetHeader(specSheet, RmGoodsSpecVO.class);
//
//            // 填充数据到工作表中
//            for (GoodsDetail goodsDetail : goodsDetails) {
//                // 转换为主VO并添加到主信息工作表
//                RmGoodsMainVO mainVO = convertToMainVO(goodsDetail);
//                addRowToSheet(mainSheet, mainVO);
//
//                // 转换为规格VO并添加到规格信息工作表
//                List<RmGoodsSpecVO> specVOs = convertToSpecVOs(goodsDetail);
//                for (RmGoodsSpecVO specVO : specVOs) {
//                    addRowToSheet(specSheet, specVO);
//                }
//            }
//
//            // 写入字节数组
//            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//            workbook.write(outputStream);
//            return outputStream.toByteArray();
//        }
//    }
//
//    /**
//     * 创建规格表头
//     *
//     * 该方法专门用于创建商品规格信息表格的表头它调用了一个通用的方法createSheetHeader，
//     * 该方法根据RmGoodsSpecVO类的结构在给定的工作表(sheet)上创建表头
//     *
//     * @param sheet 工作表对象，表示一个Excel工作表，用于写入表头信息
//     */
//    private static void createSpecSheetHeader(Sheet sheet) {
//        createSheetHeader(sheet, RmGoodsSpecVO.class);
//    }
//
//    /**
//     * 创建主表头
//     *
//     * 此方法用于在指定的工作表上创建主表的表头它调用了一个通用的方法
//     * {@link #createSheetHeader(Sheet, Class)} 来处理实际的表头创建逻辑
//     *
//     * @param sheet 工作表对象，表示要在其上创建表头的工作表
//     */
//    private static void createMainSheetHeader(Sheet sheet) {
//        createSheetHeader(sheet, RmGoodsMainVO.class);
//    }
//
//    /**
//     * 通用的表头创建方法，通过反射获取类的ExcelColumn注解信息
//     *
//     * @param sheet 工作表
//     * @param clazz VO类
//     */
//    private static <T> void createSheetHeader(Sheet sheet, Class<T> clazz) {
//        Row headerRow = sheet.createRow(0);
//
//        // 获取所有带ExcelColumn注解的字段
//        List<Field> fields = new ArrayList<>();
//        for (Field field : clazz.getDeclaredFields()) {
//            if (field.isAnnotationPresent(ExcelColumn.class)) {
//                fields.add(field);
//            }
//        }
//
//        // 按order排序
//        fields.sort(Comparator.comparingInt(field -> field.getAnnotation(ExcelColumn.class).order()));
//
//        // 创建表头
//        for (int i = 0; i < fields.size(); i++) {
//            Field field = fields.get(i);
//            ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
//            if (annotation.export()) {
//                headerRow.createCell(i).setCellValue(annotation.name());
//            }
//        }
//    }
//
//    /**
//     * 通用的添加行数据方法，通过反射获取对象的字段值
//     *
//     * @param sheet 工作表
//     * @param obj   数据对象
//     */
//    private static <T> void addRowToSheet(Sheet sheet, T obj) {
//        Row row = sheet.createRow(sheet.getLastRowNum() + 1);
//        Class<?> clazz = obj.getClass();
//
//        // 获取所有带ExcelColumn注解的字段
//        List<Field> fields = new ArrayList<>();
//        for (Field field : clazz.getDeclaredFields()) {
//            if (field.isAnnotationPresent(ExcelColumn.class)) {
//                fields.add(field);
//            }
//        }
//
//        // 按order排序
//        fields.sort(Comparator.comparingInt(field -> field.getAnnotation(ExcelColumn.class).order()));
//
//        // 填充数据
//        for (int i = 0; i < fields.size(); i++) {
//            Field field = fields.get(i);
//            ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
//
//            if (annotation.export()) {
//                Cell cell = row.createCell(i);
//                field.setAccessible(true);
//
//                try {
//                    Object value = field.get(obj);
//                    if (value != null) {
//                        if (value instanceof String) {
//                            cell.setCellValue((String) value);
//                        } else if (value instanceof Integer) {
//                            cell.setCellValue((Integer) value);
//                        } else if (value instanceof Long) {
//                            cell.setCellValue((Long) value);
//                        } else if (value instanceof Double) {
//                            cell.setCellValue((Double) value);
//                        } else if (value instanceof BigDecimal) {
//                            cell.setCellValue(((BigDecimal) value).doubleValue());
//                        } else if (value instanceof Boolean) {
//                            cell.setCellValue((Boolean) value ? "是" : "否");
//                        } else {
//                            cell.setCellValue(value.toString());
//                        }
//                    } else {
//                        cell.setCellValue("");
//                    }
//                } catch (IllegalAccessException e) {
//                    cell.setCellValue("ERROR");
//                }
//            }
//        }
//    }
//
//    /**
//     * 将GoodsDetail对象转换为RmGoodsMainVO对象
//     *
//     * @param goodsDetail 商品详情对象
//     * @return 转换后的RmGoodsMainVO对象
//     */
//    private static RmGoodsMainVO convertToMainVO(GoodsDetail goodsDetail) {
//        RmGoodsMainVO vo = new RmGoodsMainVO();
//        // 设置基础商品信息
//        vo.setGoodsId(goodsDetail.getGoodsId().toString());
//        vo.setGoodsName(goodsDetail.getGoodsName());
//        vo.setCategory(goodsDetail.getCategoryId().toString());
//
//        // 处理商品简介，截取前40个字符
//        vo.setShareDesc(
//                goodsDetail.getIntroduction().substring(0, Math.min(40, goodsDetail.getIntroduction().length())));
//
//        // 处理商品卖点，截取前60个字符
//        vo.setSellingPoint(
//                goodsDetail.getGoodsContent().substring(0, Math.min(60, goodsDetail.getGoodsContent().length())));
//
//        // 设置是否支持快递（当配送类型为2时支持）
//        vo.setSupportExpress(goodsDetail.getDeliveryType() == 2);
//
//        // 设置商品详细描述HTML内容
//        vo.setDetailHtml(goodsDetail.getGoodsContent());
//        // 其他字段根据业务需求设置默认值或从goodsDetail获取
//        return vo;
//    }
//
//    /**
//     * 将商品详情转换为规格视图对象列表
//     *
//     * @param goodsDetail 商品详情对象
//     * @return 规格视图对象列表，包含主规格和SKU规格
//     */
//    private static List<RmGoodsSpecVO> convertToSpecVOs(GoodsDetail goodsDetail) {
//        List<RmGoodsSpecVO> specVOs = new ArrayList<>();
//
//        /* 处理主规格 */
//        RmGoodsSpecVO mainSpec = new RmGoodsSpecVO();
//        mainSpec.setGoodsId(goodsDetail.getGoodsId().toString());
//        mainSpec.setSpecType(goodsDetail.getIsSku() == 1 ? "多规格" : "单规格");
//        mainSpec.setPrice(new BigDecimal(goodsDetail.getPrice()));
//        mainSpec.setLinePrice(new BigDecimal(goodsDetail.getMarketPrice()));
//        mainSpec.setStock(goodsDetail.getGoodsStock());
//        specVOs.add(mainSpec);
//
//        /* 处理SKU规格 */
//        if (goodsDetail.getSkuData() != null) {
//            for (SkuData sku : goodsDetail.getSkuData()) {
//                RmGoodsSpecVO specVO = new RmGoodsSpecVO();
//                specVO.setGoodsId(goodsDetail.getGoodsId().toString());
//                specVO.setSpecType("SKU规格");
//                specVO.setPrice(sku.getPrice());
//                specVO.setLinePrice(sku.getMarketPrice());
//                specVO.setStock(sku.getStock());
//                specVO.setSkuCode(sku.getSkuId().toString());
//                specVOs.add(specVO);
//            }
//        }
//
//        return specVOs;
//    }
//}
